import { getToken, removeToken, setTime, setToken } from '@/utils/auth'
import { getUserInfoApi, getUserInfoDetailApi, login } from '@/api/user'
import { resetRouter } from '@/router'
import bd from '@/utils/postMessage'

const state = {
  token: getToken(), // 从本地存储里面取token
  userInfo: {} // 存储用户信息对象
}

const mutations = {
//   提供一个修改state的方法
  handleLogin(state, newToken) {
    state.token = newToken
    //   存一份到本地存储
    setToken(newToken)
  },
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },
  //   移除token
  removeToken(state) {
    // FIXME: removeToken方法从utils/storage.js中进行引入
    removeToken()
    state.token = null
  },
  //   移除用户信息
  removeUserInfo(state) {
    //   vuex里面的userInfo重置为空对象
    state.userInfo = {}
  }
}
const actions = {
  // 调用登录的接口
  async loginAction(ctx, data) {
    // 调用登录的接口
    const res = await login(data)
    // 登录成功的token
    //   调用mutations
    ctx.commit('handleLogin', res)
    // 登录成功的时候，把当前的时间戳存储到本地
    setTime()
  },
  //  个人信息的获取
  async getUserInfoAction(ctx) {
    // 调接口
    // 用户信息存储在两个接口里面，两个接口拿到结果进行合并
    const res = await getUserInfoApi()
    // 请求第二个获取信息的接口，返回的数据进行合并之后，更新到state里面
    // res.userId是从第一个接口获取到的数据
    const baseInfo = await getUserInfoDetailApi(res.userId)
    // 打印获取到的结果
    // 两个接口的数据进行合并，之后更新vuex状态
    ctx.commit('setUserInfo', { ...res, ...baseInfo })
    // 获取到的所有的个人信息，全部return回去
    return {
      ...res,
      ...baseInfo
    }
  },
  // 退出登录的actin
  logoutAction(ctx) {
    //   移除token
    ctx.commit('removeToken')
    ctx.commit('removeUserInfo')
    // 重置路由匹配信息【重置的方法router.js已经提供好了，直接调用即可】
    resetRouter()
    //   移除用户信息
    //   vuex里面的维护的路由表信息也重置
    //   现在在user模块里面，修改permission模块里面的状态信息
    //  root: true 在全局命名空间调用mutation
    ctx.commit('permission/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

